package com.lishem.top100._06matrix;

/**
 * https://leetcode.cn/problems/rotate-image/description/
 * <p>
 * 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
 * <p>
 * 你必须在 原地 旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
 * <p>
 * 示例 1：
 * <p>
 * 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
 * <p>
 * 输出：[[7,4,1],[8,5,2],[9,6,3]]
 * <p>
 * 示例 2：
 * <p>
 * 输入：matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
 * <p>
 * 输出：[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
 */
public class _03LetCode48_旋转图像 {

    // 首先明确是 n*n 的，也就是说这个矩阵是方的
    public void rotate(int[][] matrix) {
        int left = 0;
        int right = matrix.length - 1;
        while (left < right) {
            for (int i = 0; i < right - left; i++) {
                int tmp = matrix[left][i + left];
                matrix[left][i + left] = matrix[right - i][left];
                matrix[right - i][left] = matrix[right][right - i];
                matrix[right][right - i] = matrix[i + left][right];
                matrix[i+left][right] = tmp;
            }
            left++;
            right--;
        }
    }

    public static void main(String[] args) {
        _03LetCode48_旋转图像 sol = new _03LetCode48_旋转图像();
        int[][] matrix1 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        sol.rotate(matrix1);
        printArray(matrix1);
        int[][] matrix2 = {{5, 1, 9, 11}, {2, 4, 8, 10}, {13, 3, 6, 7}, {15, 14, 12, 16}};
        sol.rotate(matrix2);
        printArray(matrix2);
    }

    public static void printArray(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println("-----------------");
    }
}
